package util;

import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author : yang.xp
 * @date : 2022/3/24 18:09
 * @description : 关于时区的测试
 */
public class DateTest {

    private static final Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new ConcurrentHashMap<>();
    public static final String YMD_FORMAT_Z = "yyyy_MM_dd_Z";
    public static final String YMD_FORMAT = "yyyy_MM_dd";
    public static final String YMDHMS_FORMAT_Z = "yyyy_MM_dd_HH_mm_ss_Z";
    public static final String YMDHMS_FORMAT = "yyyy_MM_dd_HH_mm_ss";

    private static final String testValueStr = "2022_04_01_00_00_00_-0500";
    private static final String testValueStrNo = "2022_04_01_00_00_00";

    public static void main(String[] args) {
        try {
            test(YMDHMS_FORMAT_Z, testValueStr);
            test(YMDHMS_FORMAT, testValueStrNo);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public static void test(String format, String testValue) throws ParseException {
        // 设置服务器时区
        // 在jvm参数种设置时区 -Duser.timezone=GMT+08  -Duser.timezone=GMT-05
        // linux 中 vim /etc/timezone 编辑修改对应时区  linux 查看当前时区 timedatectl | grep "Time zone"
//        System.setProperty("user.timezone", "GMT-05");
// 输出当前默认时区
        // sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]
        System.out.println(TimeZone.getDefault());
        // 当前时间、美国时间、服务器时间、代码运行时间
        // 服务器运行时间为美国当地时间 2022-03-24 05:12:03.566
        // 服务器机器时间为北京时间 Thu Mar 24 18:12:16 CST 2022
        // 配置表时间 2022_04_01_00_00_00_-0500  在东8区下转换后的时间是  Fri Apr 01 13:00:00 CST 2022
        // 配置表时间 2022_04_01_00_00_00_-0500  在西5区下转换后的时间是  Fri Apr 01 00:00:00 GMT-05:00 2022
        // 2022_04_01_00_00_00_-0500 表示西5区下的 4/1 00:00:00 如果当前是东8区则会以这个时间为准，自动转换为东8区的当前时间

        // 实际案例
        // jvm 配置 -Duser.timezone=${timeZone:=GMT+08}
        System.out.println("服务器运行时间：" + new Date());
        Date testValueDate = getSimpleDateFormat(format).parse(testValue);
        System.out.println("读取配置的时间：" + testValueDate);

        System.out.println(" ---------------------------------------------------------  ");
    }


    public static SimpleDateFormat getSimpleDateFormat(final String pattern) {
        return sdfMap.computeIfAbsent(pattern, (p) -> ThreadLocal.withInitial(() -> new SimpleDateFormat(p))).get();
    }
}
